% ! tex root = ../studynote.tex
\chapter{配方及其组合}
\section{配方}
配方是指某个可以一步完成的合成过程。一个配方包括原料及其比例、产物及其比例和用时。为了提高效率，通常我们会将几个前后关联的配方放在一起进行配比和生产。这样还可以减少需要长距离运输的物品的数量，简化总线的复杂度。
\section{配比的一般步骤}
将不同的配方组合起来在相近的范围内执行，需要确定组装机的分工。这时就需要计算物品生产的效率。我们以绿瓶的配方为例，从铜板和铁板合成绿瓶牵涉到的配方如下：
\begin{align*}
\text{电力机械臂}+\text{基础传送带} &\rightarrow \text{绿瓶} &t=6.0 s\\
\text{电路板}+\text{铁齿轮}+\text{铁板} &\rightarrow \text{电力机械臂}&t=0.5 s\\
\text{铁齿轮}+\text{铁板} &\rightarrow 2\text{基础传送带} &t=0.5 s\\
3\text{铜线}+\text{铁板} &\rightarrow \text{电路板} &t=0.5 s\\
2\text{铁板} &\rightarrow \text{铁齿轮} &t=0.5 s\\
\text{铜板} &\rightarrow 2\text{铜线} &t=0.5 s\\
\end{align*}

假设我们的目标产率为1/s，那么可以按照这个结果依次向下计算各个配方的比例，如下：
\begin{align*}
\text{电力机械臂}+\text{基础传送带} &\rightarrow \text{绿瓶} &1/s\\
\text{电路板}+\text{铁齿轮}+\text{铁板} &\rightarrow \text{电力机械臂}&1/s\\
\frac{1}{2}\text{铁齿轮}+\frac{1}{2}\text{铁板} &\rightarrow \text{基础传送带} &\frac{1}{2}/s\\
3\text{铜线}+\text{铁板} &\rightarrow \text{电路板} &1/s\\
3\text{铁板} &\rightarrow \frac{3}{2}\text{铁齿轮} &\frac{3}{2}/s\\
\frac{3}{2}\text{铜板} &\rightarrow 3\text{铜线} &\frac{3}{2}/s\\
\end{align*}
将右侧的效率乘上对应的时间就是应该使用的组装机的个数。可以得到
\begin{table}[htbp]
    \centering
    \begin{tabular}{cc|cc}
        \hline
        物品&组装机个数&物品&组装机个数 \\ \hline
        绿瓶&6&电路板&0.5\\
        电力机械臂&0.5&铁齿轮&0.75\\
        基础传送带&0.25&铜线&0.75\\ \hline
    \end{tabular}
\end{table}

对于不是整数的情况，可以通过扩大倍数的方法变成整数，如果不想扩大生产，可以将几个不同功能区的需求合起来一起供应。这时就需要和其他的配方综合在一起进行设计\footnote{在本手册的公开发布地址\url{https://gitee.com/windflows/factorio-study}可以找到配方的数据库和示例的处理脚本，通过运行脚本可以方便地计算指定最终产物和效率后每种中间产物所要求的生产效率以及相应的组装机数量}。

\section{两组特殊的配方}
通常情况下，物品之间的原料-产品关系可以画成树形图，但是有两组特殊的配方形成了循环图，它们分别是石油处理和铀处理。本节将介绍这两个特殊配方组合的处理方式。
\subsection{石油处理}
石油处理以原油为出发点，通过不同的配方在重油、轻油和石油气之间转换，最后可以直接生产的有固体燃料、火箭燃料、润滑油、塑料和硫磺。其合成关系如下图：
\begin{figure}[htbp]
    \centering
    \begin{tikzpicture}
    \node (W)  at (-1,3) {水};
    \node (CO) at (1,3) {原油};
    \node (HO) at (-2,0) {重油};
    \node (LO) at (0,0) {轻油};
    \node (OS) at (2,0) {石油气};
    \node (ST) at (-4,0) {蒸汽};
    \node (C)  at (-6,0) {煤炭};
    \draw[blue] (W) -- (-1,2) -- (1,2) -- (CO);
    \draw[blue,->] (0,2) -- (LO);
    \draw[blue,<->] (HO) -- (-2,1) -- (2,1) -- (OS);
    \draw[->] (W) -- (-4,3) -- (ST);
    \draw (C) -- (-6,-1) -- (-2.1,-1) -- (-2.1,-0.3);
    \draw (ST) -- (-4,-2) -- (0,-2) -- (0,-1);
    \draw[->] (0,-1) -- (LO);
    \draw[->] (0,-1) -- (OS);
    \draw[->] (0,-1) -- (HO);
    \draw[red,->] (HO) -- (LO);
    \draw[orange,->] (LO) -- (OS);
    \draw[purple,->] (CO) -- (2.2,3) -- (2.2,0.3);
    \end{tikzpicture}
\end{figure}
涉及到的配方有：
\begin{align}
&\color{blue} 100\text{原油}+50\text{水} \rightarrow 25\text{重油}+45\text{轻油}+55\text{石油气}&t=5.0 s \label{高级原油处理}\\
&\color{red} 40\text{重油}+30\text{水} \rightarrow 30\text{轻油} &t=2.0 s \label{重油裂解} \\
&\color{orange} 30\text{轻油}+30\text{水} \rightarrow 20\text{石油气} &t=2.0 s \label{轻油裂解}\\
&10\text{煤矿}+25\text{重油}+50\text{蒸汽} \rightarrow 90\text{重油}+20\text{轻油}+10\text{石油气} &t=5.0 s \label{煤炭液化}\\
&\color{purple}100\text{原油} \rightarrow 45\text{石油气} &t=5.0 s \label{初级原油处理}
\end{align}
一般来说，配方(\ref{初级原油处理})只在初期处理时才会使用，而(\ref{煤炭液化})要到后期才能解锁。大规模处理时使用到的配方为(\ref{高级原油处理})、(\ref{重油裂解})、(\ref{轻油裂解})。我们分别讨论不存在(\ref{煤炭液化})时和存在(\ref{煤炭液化})时的计算方法。
\subsubsection{不存在(\ref{煤炭液化})时}
假设使用到的配方的反应量分别为x、y和z：
\begin{align*}
100\text{原油}+50\text{水} &\rightarrow 25\text{重油}+45\text{轻油}+55\text{石油气}&x\\
40\text{重油}+30\text{水} &\rightarrow 30\text{轻油} &y \\
30\text{轻油}+30\text{水} &\rightarrow 20\text{石油气} &z
\end{align*}
并假设重油、轻油和石油气的需求为a、b和c，我们可以列出方程：
\begin{equation}\label{没有液化}
\left\lbrace \begin{array}{rlc}
25x-40y & =a & \text{重油} \\
45x+30y-30z &=b &\text{轻油} \\
55x+20z &=c &\text{石油气}
\end{array}\right.
\end{equation}

\subsubsection{存在(\ref{煤炭液化})时}
假设使用到的配方反应量分别为x、y、z和w：
\begin{align*}
100\text{原油}+50\text{水} &\rightarrow 25\text{重油}+45\text{轻油}+55\text{石油气}&x\\
40\text{重油}+30\text{水} &\rightarrow 30\text{轻油} &y\\
30\text{轻油}+30\text{水} &\rightarrow 20\text{石油气} &z\\
10\text{煤矿}+25\text{重油}+50\text{蒸汽} &\rightarrow 90\text{重油}+20\text{轻油}+10\text{石油气} &w
\end{align*}
同样可以列得方程
\begin{equation}\label{有液化}
\left\lbrace \begin{array}{rlc}
25x-40y+65w & =a & \text{重油} \\
45x+30y-30z+20w &=b &\text{轻油} \\
55x+20z+10w &=c &\text{石油气}
\end{array}\right.
\end{equation}

需要注意的是，两个方程组(\ref{没有液化})、(\ref{有液化})不是在所有情况下都有解的。因为除了方程组里的关系以外，还要求其中的所有的变量都不小于0。对方程组(\ref{没有液化})直接求解可以得到
\begin{equation}
\left\lbrace \begin{aligned}
x = \frac{12a+16b+24c}{2340} \\
y = \frac{-51a+10b+15c}{2340} \\
z = \frac{-33a-44b+51c}{2340}
\end{aligned}\right.
\end{equation}